#' 确定最大值函数对应自变量所处的区间
#'
#' @description 给出任何一个格点值，给出下一期资本存量的取值区间。
#' 该函数仅需提供全部格点agrid，值函数，和下一期资本存量从哪个格点开始搜寻。
#' 注意，值函数的参数a0会给出要求的那个格点是哪个,最终返回对应
#' a0的下一期资本存量a1的取值区间。
#'
#' @param agrid 资本存量格点
#' @param valuefun 值函数，是个函数名，该函数返回贝尔曼方程的左边. 要注意这个函数需要
#' 一个下一期资本存量的标量a1，这个变量往往是你正在寻找的格点的后续格点的值。
#' @param m0 格点搜索的起始位置，随着从小到大的格点逐个搜索，这个位置会逐渐后移，因为
#' 值函数是单调的。
#' @param ... valuefun函数的参数
#'
#' @return 返回agrid'的取值范围即ax,bx,cx,以及格点搜索进行到的位置m0,以及该位置下值函数的取值v0
#'
#'
decise_range <- function(agrid, valuefun, m0, v0 = -1e10, ...){
  # triple ax, bx, cx: [ax,bx] bracket the maximum of Bellman eq.
  ax <- agrid[1]
  bx <- agrid[1]
  cx <- agrid[length(agrid)]
  m <- m0 - 1
  # browser()

  # locate ax <= agrid' <= cx that bracket the maximum
  while (m < length(agrid)){
    m <- m+1
    v1 <- valuefun(...)
    # browser()

    # 如果V1一直比V0大，意味着函数的拐点没有达到，所以m还要往前递进
    # 直到V1比V0小，意味着拐点就在m-1和m之间了，此时就可以给cx赋值
    if (v1 > v0){# new value at lower bound agrid[0]
      if (m==1){
        ax <- agrid[m]
        bx <- agrid[m]
        cx <- agrid[m+1]
      } else if (m == length(agrid)){
        ax <- agrid[m-1]
        bx <- agrid[m]
        cx <- agrid[m]
      } else {
        ax <- agrid[m-1]
        bx <- agrid[m]
        cx <- agrid[m+1]
      }
      v0 <- v1
      m0 <- m   # monotonocity of the value function
    } else m = length(agrid)
  }
  return(list(ax = ax, bx = bx, cx = cx, m0 = m0, v0 = v0))
}
